package org.proxycine.gestsalles.web.beans;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;

import org.proxycine.gestsalles.model.entities.Copie;
import org.proxycine.gestsalles.model.entities.EtatCopie;
import org.proxycine.gestsalles.model.entities.Film;
import org.proxycine.gestsalles.services.CatalogueService;
import org.proxycine.gestsalles.services.CopieService;
import org.proxycine.gestsalles.services.FilmService;
import org.proxycine.gestsalles.web.constantes.ConstantesWeb;
 
@ManagedBean
@SessionScoped
public class CatalogueBean implements Serializable {
	
	private static final long serialVersionUID = 1L;
	
	private List<Film> filmsCatalogue;
	private List<Copie> copiesAchetees;
	private int nbFilmsDansPanier;
	private String errorMessage;
	private boolean valideAchatPressed;


	// liste des films que l'user veut acheter
	private List<Integer> data;
	
	public CatalogueBean() {
		valideAchatPressed = false;
		filmsCatalogue = new ArrayList<Film>();
		filmsCatalogue = CatalogueService.getInstance().getFilms();
		copiesAchetees = new ArrayList<Copie>();
		data = new ArrayList<Integer>();

		nbFilmsDansPanier = 0;

		for (int i = 0; i < filmsCatalogue.size(); i++)
			data.add(0);
		
		
	}

	public List<Film> getFilmsCatalogue() {
		return filmsCatalogue;
	}

	public void setFilmsCatalogue(List<Film> filmsCatalogue) {
		this.filmsCatalogue = filmsCatalogue;
	}

	public List<Copie> getCopiesAchetees() {
		return copiesAchetees;
	}

	public void setCopiesAchetees(List<Copie> copiesAchetees) {
		this.copiesAchetees = copiesAchetees;
	}
	
	public List<Integer> getData() {
		return data;
	}

	public void setData(List<Integer> data) {
		this.data = data;
	}

	public void addFilm(int index) {
		data.set(index, data.get(index)+1);
		nbFilmsDansPanier++;
	}

	public void removeFilm(int index) {
		
		if (data.get(index) > 0) {
			data.set(index, data.get(index)-1);
			nbFilmsDansPanier--;
		}
	}
	
	public int getNbFilmsDansPanier() {
		return nbFilmsDansPanier;
	}
	
	public void setErrorMessage(String errorMessage) {
		this.errorMessage = errorMessage;
	}

	public String getErrorMessage() {
		if(nbFilmsDansPanier == 0 && valideAchatPressed)
			errorMessage = ConstantesWeb.ERROR_MESSAGE_ACHAT_FILM;
		else
			errorMessage = "";
		
		return errorMessage;
	}
	
	public boolean isValideAchatPressed() {
		return valideAchatPressed;
	}

	public void setValideAchatPressed(boolean valideAchatPressed) {
		this.valideAchatPressed = valideAchatPressed;
	}

	public void setNbFilmsDansPanier(int nbFilmsDansPanier) {
		this.nbFilmsDansPanier = nbFilmsDansPanier;
	}

	public String valideAchat() {
		
		String retour = "valide";
		valideAchatPressed = true;
		
		if (nbFilmsDansPanier > 0) {
			for (int i = 0; i < data.size(); i++) {		
				// Si on a acheté ce film, on en crée le bon nombre de copies,
				// que l'on insère dans la liste des copies achetées
				if (data.get(i) > 0) {				
					for (int j = 0; j < data.get(i); j++)
						copiesAchetees.add(new Copie(filmsCatalogue.get(i), null, EtatCopie.Achete));
				}
			}
			
			System.out.println("Copies achetées : ");
			for (Copie c : copiesAchetees) {
				System.out.println(c.getFilm().getTitre());
			}
			
			
			// Insérer les copies et les films en base de données
			for (Copie c : copiesAchetees) {
				int idFilm = 0;
				
				// Si le film n'existe pas déjà en BD, on l'insère
				Film f = FilmService.getInstance().getFilm(c.getFilm().getTitre()); 
				if (f == null) {
					idFilm = FilmService.getInstance().insertFilm(c.getFilm());
				} else {
					idFilm = f.getId();
				}
				
				// Dans tous les cas, on insère la copie
				CopieService.getInstance().insertCopie(c, idFilm);
			}	
			
			
			// Une fois qu'on a bien inséré les copies en BD, on peut vider la liste créée
			// ainsi que le nombre de films dans le panier et les films sélectionés
			this.copiesAchetees.clear();
			this.nbFilmsDansPanier = 0;
			for (int i = 0; i < filmsCatalogue.size(); i++)
				data.set(i, 0);
			
			valideAchatPressed = false;
		} else {
			retour = "error";
		}
		
		return retour;
	}
}
